#include"BlockQueue.hpp"
#include"Task.hpp"
struct data
{
    std::string name;
    // BlockQueue<int>*bq;
    BlockQueue<Task>*bq;
};

void* product(void*args)
{
    data*d=static_cast<data*>(args);
    // int t=1;
    int a=0,b=1;
    while(true)
    {
        Task t(a,b);
        d->bq->Enqueue(t);
        // std::cout << "生产者生产了一个数据: "<<t<< std::endl;
        std::cout << "生产者生产了一个任务"<< std::endl;
        a++,b++;
    }
}

void* customer(void*args)
{
    data*d=static_cast<data*>(args);
    while(true)
    {
        sleep(1);
        Task t;
        d->bq->Pop(&t);
        t();
        t.Print();
        // std::cout << "消费者获得了一个数据: "<< t <<std::endl;
    }
}


int main()
{
    BlockQueue<Task> *bq=new BlockQueue<Task>();
    pthread_t c,p;
    data cd={"消费者",bq};
    data pd={"生产者",bq};
    pthread_create(&c,nullptr,customer,(void*)&cd);
    pthread_create(&p,nullptr,product,(void*)&pd);

    pthread_join(c,nullptr);
    pthread_join(p,nullptr);

    delete bq;
    return 0;
}